package com.xxjh.brs.uavmodeling.predicate.sftp;

import com.jcraft.jsch.ChannelSftp;
import com.xxjh.brs.sftp.common.predicate.SftpPredicate;

import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author CHENCHEN
 * @title a
 * @company 新兴际华科技（天津）有限公司
 * @create 2024-07-04 20:46
 */
public class SftpSearch3dTilesPredicate implements SftpPredicate {

    //查找特定的目录
    public static final String[] FOLDERSTOCHECK = {"3dTiles", "dense_b3dm", "sparse_b3dm"};

    // 路径前缀
    public static final String PRE_TILES = "^(.+)/datasets/project/";

    //查找特定的文件
    public static final String TILESET_JSON = "tileset.json";

    public static final String TILES = "/3dTiles/";

    public static final String DENSE_B3DM = "/PointClouds/dense_b3dm/";

    public static final String SPARSE_B3DM = "/PointClouds/sparse_b3dm/";

    @Override
    public boolean directorySearch(ChannelSftp.LsEntry entry, String directory) {
        for (String folder : FOLDERSTOCHECK) {
            if(directory.indexOf(folder) != -1){
                return TILESET_JSON.equals(entry.getFilename());
            }
        }
        return false;
    }

    /**
     * 筛选并排序路径列表，确保具有最高优先级的文件路径排在前面。
     * 优先顺序为：包含'tiles'路径 > 'dense_b3dm' > 'sparse_b3dm'。
     *
     * @param path 待筛选和排序的原始文件路径。
     * @param prefixToPath 先级筛选后的路径列表。
     */
    @Override
    public void searchByRule(String path, Map<String, String> prefixToPath) {
        // 提取路径前缀
        Matcher matcher = Pattern.compile(PRE_TILES).matcher(path);
        if (matcher.find()) {
            String prefix = matcher.group(1);
            // 检查是否包含3dTiles路径，优先添加
            if (path.contains(TILES)) {
                prefixToPath.put(prefix, path); // 有3dTiles则直接覆盖之前的记录
            } else if (!prefixToPath.containsKey(prefix)) {
                // 如果没有3dTiles且该前缀还未记录任何路径，则检查dense_b3dm和sparse_b3dm
                if (path.contains(DENSE_B3DM)) {
                    prefixToPath.put(prefix, path); // 优先dense_b3dm
                } else if (path.contains(SPARSE_B3DM)) {
                    prefixToPath.put(prefix, path); // 若无dense_b3dm则选择sparse_b3dm
                }
            }
        }
    }
}
